package main.old.new_2023.last.month_6;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description:
 * //TODO 2352. 相等行列对
     * 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ，返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。
     * 如果行和列以相同的顺序包含相同的元素（即相等的数组），则认为二者是相等的。
 * //todo 剑指 Offer 20. 表示数值的字符串
     * 请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。
     * 数值（按顺序）可以分成以下几个部分：
     * 若干空格
     * 一个 小数 或者 整数
     * （可选）一个 'e' 或 'E' ，后面跟着一个 整数
     * 若干空格
     * 小数（按顺序）可以分成以下几个部分：
     * （可选）一个符号字符（'+' 或 '-'）
     * 下述格式之一：
     * 至少一位数字，后面跟着一个点 '.'
     * 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字
     * 一个点 '.' ，后面跟着至少一位数字
     * 整数（按顺序）可以分成以下几个部分：
     * （可选）一个符号字符（'+' 或 '-'）
     * 至少一位数字
     * 部分数值列举如下：
     * ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
     * 部分非数值列举如下：
     * ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
 * @Author: Take-off
 * @Date: 1:00 PM 2023/6/5
 * @Param:
 * @return:
 **/
public class Solution0606 {

    //表示数值的字符串
    public boolean isNumber(String s) {
        String str = s.trim();
        boolean numFlag = false;
        boolean eFlag = false;
        boolean dianFlg = false;
        for(int i=0; i<str.length(); i++) {
            char ch = str.charAt(i);
            if(Character.isDigit(ch)) {
                numFlag = true;
            } else if(ch == '.' && !dianFlg && !eFlag && ( (i+1 <str.length() &&  Character.isDigit(str.charAt(i+1)) || (i!=0 && numFlag)))) {
                //是 。 之前不能出现过并且前面没有 e或者E 并且后面还有数字
                dianFlg = true;
            } else if((ch == 'e' || ch == 'E') && !eFlag && numFlag ) {
                //是 e或者  E，必须之前没有出现过且前面有数字
                eFlag = true;
                numFlag = false;

            } else if((ch == '-' || ch == '+') && (i==0 || str.charAt(i-1) == 'e' ||str.charAt(i-1) == 'E' )) {
                //是 +或者 - ，必须要是第一位 或者 前一位是 e 或者 E
            }else {
                return false;
            }
        }
        return numFlag;
    }


    //相等行列对
    public int equalPairs(int[][] grid) {

        //首先将矩阵的行放入哈希表中统计次数，哈希表的键可以是将行拼接后的字符串，
        // 也可以用各语言内置的数据结构，然后分别统计每一列相等的行有多少，求和即可。
        int length = grid.length;
        Map<List<Integer>, Integer> listIntegerHashMap = new HashMap<>();
        //行
        List<int[]> hangs = Arrays.stream(grid).collect(Collectors.toList());
        for (int[] ints:hangs){
            List<Integer> hang = Arrays.stream(ints).boxed().collect(Collectors.toList());
            if (listIntegerHashMap.containsKey(hang)){
                listIntegerHashMap.put(hang,listIntegerHashMap.get(hang)+1);
            }else {
                listIntegerHashMap.put(hang,1);
            }
        }

        int res = 0;
        //列
        for (int i = 0; i<length;i++){
            List<Integer> lie = new ArrayList<>();
            for (int j = 0; j<length;j++){
                lie.add(grid[j][i]);
            }
            if (listIntegerHashMap.containsKey(lie)){
                res = res+ listIntegerHashMap.get(lie);
            }else {
                listIntegerHashMap.put(lie,1);
            }
        }
        return res;
    }



    public static void main(String[] args) {
        int[][] nums = {{3,2,1},{1,7,6},{2,7,7}};
        Solution0606 solu = new Solution0606();
        int valid = solu.equalPairs(nums);
        System.out.println(valid);


    }

}
